# 目的：对字符进行计数，直到遇到空字符
#
# 输入：字符串地址
#
# 输出：将计数器返回道%rax
#
# 用到的寄存器：
#       %rcx - 字符计数
#       %al  - 当前字符
#       %rdx - 当前字符地址

.type count_chars, @function
.globl count_chars

# 这是我们的一个参数在栈上的位置。
.equ ST_STRING_START_ADDRESS, 16
count_chars:
    push    %rbp
    mov     %rsp, %rbp
    
    # 计数器从0开始
    mov     $0, %rcx
    # 数据的起始地址
    mov     ST_STRING_START_ADDRESS(%rbp), %rdx

count_loop_begin:
    # 获取当前字符
    movb    (%rdx), %al
    # 是否为空字符？
    cmpb    $0, %al
    # 若为空字符则结束
    je      count_loop_end
    # 否则，递增计数器和指针
    inc     %rcx
    inc     %rdx
    # 返回循环起始处
    jmp     count_loop_begin

count_loop_end:
    # 结束循环，将计数器移入%rax并返回
    mov     %rcx, %rax

    pop     %rbp
    ret
